package xian.woniu.web.controller;

import org.springframework.web.bind.annotation.*;
import xian.woniu.entity.User;
import xian.woniu.mapper.PatientMapper;
import xian.woniu.service.IUserService;
import xian.woniu.util.JwtUtils;
import xian.woniu.util.ResultVO;
import xian.woniu.util.TokenBean;

import javax.servlet.http.HttpServletRequest;

@RestController
public class AuthController {


    //这里是使用策略模式，TokenBean是一个接口，实现后可以将token用各种方式来存入后端。
    private TokenBean<String,String> tokenBean;

    IUserService iUserService;




    public AuthController(IUserService iUserService,TokenBean tokenBean){
        this.iUserService=iUserService;
        this.tokenBean=tokenBean;
    }


    //登录方法
    //如果验证通过的话，会将Token存入后端，并且向前端返回一个Token值。
    //验证失败返回200响应码。
    @PostMapping("author/login")
    public ResultVO login(@RequestBody User user){
        String username = user.getUsername();
        String password = user.getPassword();

        User login = iUserService.login(username,password);

        if(login==null){
            return ResultVO.failure("账号或者密码错误，请重新输入");
        }

        String token = JwtUtils.createToken(login.getUsername(), 3600);

        tokenBean.put("token",token);

        return ResultVO.success(token,login);
    }


    //校验有两重检查。一个是使用工具类来进行校验，第二个是使用自定义的TokenBean存储的数据来判断token。
    //如果都通过则视为校验成功

    @PostMapping("author/verify")
    public ResultVO verify(@RequestBody String token){

        Boolean result=JwtUtils.verifyToken(token)&&tokenBean.get("token").equals(token);
        return result?ResultVO.success("校验通过"):ResultVO.failure("校验失败");
    }

    //登出方法
    @PostMapping("author/logout")
    public ResultVO logout(HttpServletRequest request){
        String token = request.getHeader("token");
        tokenBean.remove(token);
        return ResultVO.success("登出成功");
    }


    //注册方法
    @PostMapping("author/regist")
    public ResultVO regist(@RequestBody User user){
        Integer regist = iUserService.regist(user);

        return regist>0?ResultVO.success(regist):ResultVO.failure("注册失败");
    }






}
